#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>

#include "colas.h"

//static pthread_mutex_t glob_MutexDiscos =  PTHREAD_MUTEX_INITIALIZER;
//static pthread_mutex_t glob_MutexPedidos = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t glob_MutexLista = PTHREAD_MUTEX_INITIALIZER;


//void InsertarDisco(nodoLista **inicioLista, int socket, char *idDisco){//apuntador contiene el inicio de lista
//
//	nodoLista *registroNuevo;
//	registroNuevo = (nodoLista *)malloc(sizeof(nodoLista));//retorna un puntero al ppio del bloque de memoria reservado
//	if(registroNuevo != NULL)//se pudo alocar memoria
//	{
//		//se pudo alocar la memoria, entonces cargo el registro nuevo
//		registroNuevo->data.cantPed = 0;
//		registroNuevo->data.idPPD = idDisco;//verificar los tipos de id
//		registroNuevo->data.sockPPD = socket;
//		registroNuevo->data.sincronizado = 0;
//		registroNuevo->data.iniCola = NULL;
//		registroNuevo->data.finCola = NULL;
//		registroNuevo->sgte = NULL;
//
//		//INSERTO EN LA LISTA
//		registroNuevo->sgte = inicioLista;
//		*inicioLista = registroNuevo;
//	}
//}

int Pertenece(char *elemento){

	pthread_mutex_lock(&glob_MutexLista);

	nodoLista *aux;
	char r = 0;

	aux = glob_listaDiscos;//creo un puntero auxiliar para recorrer la lista
	if(aux != NULL){
		while(strcmp(aux->data.idPPD, elemento) != 0 && aux->sgte != NULL)
			aux = aux->sgte;
		//if(aux->sgte == NULL)
		if(strcmp(aux->data.idPPD, elemento) == 0)
			r = 1;//lo encontro
	}

	pthread_mutex_unlock(&glob_MutexLista);
	return r;
}
//Inserta un pedido en la cola, recibe el nodo ya cargado para insertar al final de la cola
//int InsertarPedido(nodoCola **finCola, stPEscrituraSector *sector, int tipoPedido, int sock){
//
//	nodoCola *pedidoNuevo;
//	pedidoNuevo = (nodoCola *)malloc(sizeof(nodoCola));
//	pedidoNuevo->socketFS = sock;
//	pedidoNuevo->tipoPedido = tipoPedido;
//	pedidoNuevo->sector.iSector = sector->iSector;
//	strcpy(sector->info, pedidoNuevo->sector.info);
//
//	pedidoNuevo->sgte = finCola;
//	*finCola = pedidoNuevo;
//
//	return 0;
//}
int InsertarPedido(nodoCola **finCola, stPEscrituraSector *sector, int tipoPedido, int sock){

	pthread_mutex_lock(&glob_MutexLista);

	nodoCola *pedidoNuevo;
	pedidoNuevo = (nodoCola *)malloc(sizeof(nodoCola));
	pedidoNuevo->socketFS = sock;
	pedidoNuevo->tipoPedido = tipoPedido;
	pedidoNuevo->sector.iSector = sector->iSector;
	strcpy(sector->info, pedidoNuevo->sector.info);

	pedidoNuevo->sgte = finCola;
	*finCola = pedidoNuevo;

	pthread_mutex_unlock(&glob_MutexLista);

	return 0;
}



/*Agrega un dispositivo a la lista*/
void AgregarDisco(nodoLista *newDev){

    pthread_mutex_lock(&glob_MutexLista);

    newDev->sgte = glob_listaDiscos;
    glob_listaDiscos = newDev;

    pthread_mutex_unlock(&glob_MutexLista);

}


void EncolarPedido(nodoLista *lista, int pedido, int tipoPedido, int socket){

	int min = 1000;
	nodoLista *aux, *elegido;
	stPEscrituraSector *sector;
	aux = lista;
	//recorro la lista y me fijo que disco tiene menos pedidos
	while(aux != NULL){
		if(aux->data.cantPed < min && aux->data.sincronizado == 1){
			min = aux->data.cantPed;
			elegido = aux;//me guardo la referencia al disco
		}
		aux = aux->sgte;
	}
	sector->iSector = pedido;
	InsertarPedido(&elegido, sector, tipoPedido, socket);
}


void ReacomodarPedidos(void){

}

